<?php
/**
 * Created by PhpStorm.
 * User: Mio
 * Date: 2017/10/11
 * Time: 12:24
 */

namespace app\index\model;

use think\Model;

class VerifyCode extends Model
{

    /**
     * 验证码ID
     */
    protected $verify_code_id = '';

    /**
     * 查询条件
     */
    protected $where = '';


    /**
     * 生成一个新的验证码，并返回
     * @param void
     * @return 若60秒内生成过验证码，返回false，否则返回string $verify_code 验证码
     * @todo 判断该用户60秒内是否生成过验证码，如果是，不予生成，否则生成一个新的验证码，保存到数据库，并返回
     */
    public function generateVerifyCode($mobile)
    {
        if($this->where != null){
            $this->where .= ' AND ';
        }
        $where = $this->where . ' mobile = ' . $mobile . ' AND expire_time > ' . (time() + 1800 - 60);

        $verify_code_info = $this->getVerifyCodeInfo($where, 'verify_code_id');

        if ($verify_code_info)
        {
            return false;
        }
        $verify_code = '';
        for ($i = 0; $i < 6; $i++)
        {
            $rand = rand(0,9);
            $verify_code .= $rand;
        }
        $verify_code_info = array(
            'verify_code'	=> $verify_code,
            'mobile'		=> $mobile,
            'user_id'		=> intval(session('user_id')),
            'cookie_value'	=> isset($GLOBALS['user_cookie']) ? $GLOBALS['user_cookie'] : '',
            'expire_time'	=> time() + 1800,
            'isuse'			=> 1
        );
        $this->setVerifyCodeInfo($verify_code_info);
        $this->saveVerifyCodeInfo();
        #echo $this->getLastSql();
        return $verify_code;
    }

    /**
     * 根据where查询条件获取验证码信息
     * @author 姜伟
     * @param string $fields 验证码
     * @param string $where 查询条件
     * @return 没有结果返回false，有结果返回验证码信息数组
     * @todo 若where不为空，根据where取，否则根据当前对象的where条件获取
     */
    public function getVerifyCodeInfo($where = '', $fields = '')
    {
        $where = $where ? $where : $this->where;
        return $this->field($fields)->where($where)->limit(1)->order('verify_code_id','DESC')->find();
    }


    public function getVerifyCodeInfos($where = '', $fields = '')
    {
        $where = $where ? $where : $this->where;
        return $this->field($fields)->where($where)->limit(1)->order('verify_code_id','DESC')->find()->toArray();
    }
    /**
     * 设置验证码信息
     * @author 姜伟
     * @param array	$verify_code_info	验证码信息数组，一维
     * @return void
     * @todo 修改当前对象的验证码信息，但不保存到数据库（若要保存到数据库，设置后继续调用saveVerifyCodeInfo方法）
     */
    public function setVerifyCodeInfo($verify_code_info)
    {
        foreach ($verify_code_info AS $key => $value)
        {
            $this->data[$key] = $value;
        }
    }

    /**
     * 保存验证码信息到数据库
     * @author 姜伟
     * @param array	$verify_code_info	验证码信息数组，一维
     * @return 成功返回验证码ID或数据库中记录变更数量，失败返回false或0
     * @todo 更新验证码表数据库，修改当前验证码ID对应的验证码信息
     */
    public function saveVerifyCodeInfo()
    {
        if (!$this->data || empty($this->data))
        {
            return false;
        }

        if ($this->verify_code_id)
        {
            return $this->where('verify_code_id = ' . $this->verify_code_id)->save($this->data);
        }
        else
        {
            return $this->save($this->data);
        }
    }

    /**
     * 判断一个验证码的有效性
     * @author 姜伟
     * @param $verify_code
     * @return 有效返回true，无效返回false
     * @todo 查询verify_code = $verify_code, isuse=1且expire_time < time()的记录，存在返回true，不存在返回false
     */
    public function checkVerifyCodeValid($verify_code, $mobile = '')
    {
        log_file('verify_code = ' . $verify_code, 'api_post_log');
        if ($verify_code)
        {
            $where = $this->where . ' AND isuse = 1 AND expire_time > ' . time() . ' AND verify_code = "' . $verify_code . '" AND mobile = "' . $mobile . '"';
            $verify_code_info = $this->getVerifyCodeInfo($where, 'verify_code_id');
            log_file($this->getLastSql(), 'api_post_log');
            if ($verify_code_info)
            {
                return true;
            }
        }

        return false;
    }

}